#include "Escalera.h"

Escalera::Escalera(int x, int y, string rutaImagen, int ancho, int alto, int maximoX, int maximoY) : Obstaculo(x, y, rutaImagen, ancho, alto, maximoX, maximoY) {
	setAngulo(0);
	srand (time(NULL));
	tipo = OBSTACULO;
}

void Escalera::ColisionarConPersonaje(ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja) {

	Personaje* per = dynamic_cast<Personaje*> (personaje);

	if (per->getEstado() == EstadoBasico::Saltando) per->setEstado(EstadoBasico::Quieto);

	if (colXvieja != 0) {
		if (per->getVelocidadY() < 0) {
			per->setVelocidadY(0);
			per->setPosicion(per->getX(), getY() - per->getAlto());
		}
		per->setEstadoParticular(EstadoPersonaje::SubiendoEscalera);
		per->setAlturaEscalera(getY());
	}
	else if (colYvieja != 0 || per->getVelocidadY() == 0) {
		per->setEstadoParticular(EstadoPersonaje::SubiendoEscalera);
		per->setAlturaEscalera(getY());
		per->setVelocidadY(0);
	}
	else {
		if (colX >= colY) {
			if (per->getVelocidadY() < 0) {
				per->setVelocidadY(0);
				per->setPosicion(per->getX(), getY() - per->getAlto());
			}
			per->setEstadoParticular(EstadoPersonaje::SubiendoEscalera);
			per->setAlturaEscalera(getY());
		}
		else {
			per->setEstadoParticular(EstadoPersonaje::SubiendoEscalera);
			per->setAlturaEscalera(getY());
			per->setVelocidadY(0);
		}
	}
}

void Escalera::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja) {

	ObjetoMovible* mov = dynamic_cast<ObjetoMovible*> (movible);

	int ZONA_COLISION_Y = mov->getAlto() * 0.1;

	if (colX >= colY) {

		if ((mov->getY() + mov->getAlto()/4 >= getY()) && mov->getPrioridad() != 4) return;

		// ESTO ES CABEZAAAAA:
		if (mov->getPrioridad() == 4) {
			if  ((mov->getX()+mov->getAncho() <= getX()+getAncho()) && (mov->getX() >= getX())) {
				mov->setVelocidadY(0);
				static_cast<Bomba*> (movible)->setAlturaEscalera(getY());
				static_cast<Bomba*> (movible)->setEnEscalera(true);
				return;
			} else return;
		}

		// ESTO tambien ES CABEZAAAAA:
		if ((mov->getX()+mov->getAncho()/2 < getX()+getAncho()/2 + 2 ) && (mov->getX()+mov->getAncho()/2 > getX()+getAncho()/2 - 2) && mov->getPrioridad() == 3) {
			int bajar = rand() %2;
			if (bajar) {
				static_cast<Barril*> (movible)->Detener();
				mov->setPosicion(mov->getX(), mov->getY() + mov->getAlto()/2);
				return;
			}
		}

		if (mov->getVelocidadY() < 0) {
			mov->setVelocidadY(0);
			mov->setPosicion(mov->getX(), getY() - mov->getAlto());
			if (mov->getEstado() == EstadoBasico::Saltando) mov->setEstado(EstadoBasico::Quieto);
		}
		else if (mov->getVelocidadY() > 0) {
			mov->setVelocidadY(mov->getVelocidadY() * (-1));
			mov->setPosicion(mov->getX(), getY() + getAlto() - ZONA_COLISION_Y);
		}
	}
	else {
		// ESTO ES CABEZAAAAA:
		if  ((mov->getX()+mov->getAncho() <= getX()+getAncho()) && (mov->getX() >= getX()) && mov->getPrioridad() == 4) {
			mov->setVelocidadY(0);
			static_cast<Bomba*> (movible)->setAlturaEscalera(getY());
			static_cast<Bomba*> (movible)->setEnEscalera(true);
			return;
		}
	}
}
